/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package org.genew.squadra.xml.model.builder;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.genew.squadra.xml.model.epub.EpubFiles;
import org.genew.squadra.xml.model.epub.ToZip;

/**
 *
 * @author giona_000
 */
public class BuildZip {
    
    public static void buildEpub(ToZip tz, String nomeEpub) throws IOException{
    
                //Array di byte per dare una unità di misurà per la lettura
                byte[] data = new byte[1024];
                
                //OUTPUT
                    //CREO IL FILE CON IL NOME "nomeEpup"
                FileOutputStream output = new FileOutputStream(nomeEpub); 
                    //CREO UNO STREAM PER SCRIVERE IN FORMATO ZIP NEL FILE  output
                ZipOutputStream zOs;
                zOs = new ZipOutputStream(new BufferedOutputStream(output));
                
                //INPUT
                    //PRENDO LA LISTA DEI FILE CHE BISOGNA SCRIVERE NEL FILE ZIP
                List<EpubFiles> temp = tz.getFiles();
                
                
                int i =0;
                //Zip entry rappresenta il file che vuoi inserire dentro il file zip, 
                //convenzionalmente ha lo stesso nome che ha il file di origine
                //Però se viene inserita una url completa di "/" es: OEBPS/content.xml
                //Prima di scrivere il file crea la cartella OEBPS e il file verrà inserito al suo interno
                
                //Entri è l'entita di un file che deve essere scritto dentro il file zip
                ZipEntry entry;
                
                for(EpubFiles tempFile : temp){
                    
                    String name = temp.get(i).getUrl(); //Solo nome del file 
                    String completeUrl = temp.get(i).getDir() + temp.get(i).getUrl(); //path completo nello zip
                    System.out.println(completeUrl);
                    //PRIMA VA BUILDATA LA MIMETYPE
                    if(name.equals("mimetype")){
                        //LA MIMETYPE VA BUILDATA SENZA COMPRESSIONE, CON ALL'INTERNO SCRITTO IN BYTE ED INOLTRE DEVE ESSERE IL PRIMISSIMO FILE A ESSERE SCRITTO SUL ZIP
                        byte[] content = "application/epub+zip".getBytes("UTF-8");
                        //CREA LA ENTRY MIMETYPE NELLO ZIP
                        entry = new ZipEntry("mimetype");
                        //QUESTO METODO DOVREBBE DIRE IL TIPO DI COMPRESSIONE, IN QUESTO CASO STORED DOVREBBE FARCI CAPIRE CHE VIENE SALVATO E NON COMPRESSO?
                        entry.setMethod(ZipEntry.STORED);
                        entry.setSize(20);
                        //GRANDEZZA COMPRESSIONE
                        entry.setCompressedSize(20);
                        //NON SI Sà, MA SENZA IL DOCUMENTO NON VIENE VALIDATO
                        entry.setCrc(0x2CAB616F); // pre-computed
                        //DICI CHE VUOI SCRIVERE MIMETYPE NEL ZIP
                        zOs.putNextEntry(entry);
                        //SCRIVI IL FILE NELLO ZIP
                        zOs.write(content);
                        //CHIUDI LA ENTRI
                        zOs.closeEntry();   
                    }else{
                     //Legge il file
                    FileInputStream fi = new FileInputStream(name);
                    
                    // name the file inside the zip  file                    
                    entry = new ZipEntry(completeUrl);
                    //Inserisce il file (Ora vuoto) dentro il file zip
                    zOs.putNextEntry(entry); 
                    int count;
                    while((count = fi.read(data)) > 0){
                    System.out.println();
                        //Scrive nel file entry dentro lo zip
                        
                        zOs.write(data, 0, count); //Scrivi sullo stream Output
                    }
                    //chiudo l'input della lettura del file che volevo scrivere sul file zip
                    fi.close(); //lo chiudo perchè lo stesso stream lo devo usare per scrivere il file successivo
                    }
                    i++; //Questa i mi serve per scorrere la lista
                    
                }
                zOs.close(); //Chiudo il file Zip!
    }
}
